package com.augus.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {

  // ShiroFilterFactoryBean 3
  @Bean
  public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
    ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
    // 设置安全管理器
    bean.setSecurityManager(defaultWebSecurityManager);

    // 添加shiro的内置管理器
    /**
     * anon: 无需认证就可以访问
     * authc: 编写认证了才能访问
     * user: 必须拥有 记住我 功能才能用
     * perms: 拥有某个资源的权限才能访问
     * role: 拥有某个角色权限才能访问
     */

    // 拦截
    // setFilterChainDefinitionMap ctrl+右击  进去拿参数 Map<String, String> filterChainDefinitionMap
    Map<String, String> filterMap = new LinkedHashMap<>();

    // 授权,正常的情况下会跳转到未授权页面
    filterMap.put("/user/add","perms[user:add]");
    filterMap.put("/user/update","perms[user:update]");

//    filterMap.put("/user/add","authc");
//    filterMap.put("/user/update","authc");
    filterMap.put("/user/*","authc"); // 拦截所有

    bean.setFilterChainDefinitionMap(filterMap);

    // 设置登录的请求
    bean.setLoginUrl("/tologin");
    // 未授权页面
    bean.setUnauthorizedUrl("/noauth");
    return bean;
  }

  // DafaultWebSecurityMapper 2
  @Bean(name = "securityManager")
  public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    // 关联UserRealm
    securityManager.setRealm(userRealm);

    return securityManager;
  }

  // 创建 realm 对象 realm需要自定义: 1
  // @Bean(name = "userRealm")
  @Bean
  public UserRealm userRealm(){
    return new UserRealm();
  }

  // 整合shiroDialect: 用来整合 shiro thymeleaf
  @Bean
  public ShiroDialect getShiroDialect(){
    return new ShiroDialect();
  }


}
